from RegistroDeObservadores import RegistroDeObservadores
from CalculadorDePuntaje import *

from threading import Timer
import time

class PartidaDeEncontrameSiPodes:
	def __init__(self, unESP, calculadorDePuntaje):
		self.__esp = unESP
		self.__soluciones = set()
		self.__observadores = RegistroDeObservadores()
		self.__calculadorDePuntaje = calculadorDePuntaje

	def encontrameSiPodes(self):
		return self.__esp

	def suscribirObservador(self, observador):
		self.__observadores.suscribir(observador)

	def desuscribirObservador(self, observador):
		self.__observadores.desuscribir(observador)

	def agregarSolucion(self, solucion):
		referencias = self.__esp.referencias()
		if solucion.respuesta().isalpha() & self.solucionEsValidaParaConsigna(solucion, referencias[solucion.ubicacion()].consigna()):
			self.__observadores.notificar("nuevaSolucion", solucion)
			for sol in self.__soluciones:
				if sol.ubicacion == solucion.ubicacion():
					self.remove(sol)
			self.__soluciones.add(solucion)

	def solucionEsValidaParaConsigna(self, solucion, consigna):
		return len(solucion.respuesta()) == len(consigna.respuesta())

	def iniciar(self):
		self.__tiempoActual = 0
		self.__tiempoDeInicio = time.time()
		self.__actualizarReloj()

	def terminar(self):
		self.__timer.cancel()
		solucionesCorrectas = self.__esp.verificarRespuestas(self.__soluciones)
		solucionesIncorrectas = self.__soluciones - solucionesCorrectas
		puntaje = self.__calculadorDePuntaje.calcularPuntaje(solucionesCorrectas, solucionesIncorrectas, self.__tiempoActual)
		self.__observadores.notificar("resultados", solucionesCorrectas, solucionesIncorrectas, puntaje)

	def __actualizarReloj(self):
		self.__tiempoActual = int(time.time() - self.__tiempoDeInicio)
		self.__observadores.notificar("actualizarReloj", self.__tiempoActual)
		self.__timer = Timer(1, self.__actualizarReloj)
		self.__timer.start()
